package com.micro.ai.gateway.util;

import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.StringUtils;

/**
 * IP地址工具类
 * 提供统一的客户端IP获取方法
 * 
 * @author micro-ai
 * @since 0.0.1
 */
public class IpUtils {
    
    private static final String[] IP_HEADERS = {
        "X-Forwarded-For",
        "X-Real-IP",
        "Proxy-Client-IP",
        "WL-Proxy-Client-IP"
    };
    
    /**
     * 获取客户端真实IP地址
     * 优先级: X-Forwarded-For > X-Real-IP > Proxy-Client-IP > WL-Proxy-Client-IP > RemoteAddress
     * 
     * @param request HTTP请求（不能为null）
     * @return 客户端IP地址，如果无法获取则返回"unknown"
     */
    @SuppressWarnings("null")
	public static String getClientIp(ServerHttpRequest request) {
        if (request == null) {
            return "unknown";
        }
        
        // 按优先级检查各个Header
        for (String headerName : IP_HEADERS) {
            String ip = request.getHeaders().getFirst(headerName);
            if (isValidIp(ip)) {
                // X-Forwarded-For可能包含多个IP（代理链），取第一个（真实客户端IP）
                if ("X-Forwarded-For".equals(headerName) && ip.contains(",")) {
                    String firstIp = ip.split(",")[0].trim();
                    return firstIp != null && !firstIp.isEmpty() ? firstIp : "unknown";
                }
                return ip;
            }
        }
        
        // 最后尝试从RemoteAddress获取
        try {
            if (request.getRemoteAddress() != null && 
                request.getRemoteAddress().getAddress() != null) {
                String hostAddress = request.getRemoteAddress().getAddress().getHostAddress();
                return hostAddress != null ? hostAddress : "unknown";
            }
        } catch (Exception e) {
            // 安全处理异常，避免空指针
            return "unknown";
        }
        
        return "unknown";
    }
    
    /**
     * 验证IP是否有效
     * 
     * @param ip IP地址字符串
     * @return true-有效，false-无效
     */
    private static boolean isValidIp(String ip) {
        return StringUtils.hasText(ip) && !"unknown".equalsIgnoreCase(ip);
    }
    
    /**
     * 检查IP是否为本地地址
     * 
     * @param ip IP地址（可能为null）
     * @return true-本地地址，false-非本地地址
     */
    public static boolean isLocalAddress(String ip) {
        if (ip == null || ip.trim().isEmpty()) {
            return false;
        }
        
        String trimmedIp = ip.trim();
        return "127.0.0.1".equals(trimmedIp) || 
               "localhost".equals(trimmedIp) || 
               "0:0:0:0:0:0:0:1".equals(trimmedIp) ||
               "::1".equals(trimmedIp);
    }
    
    /**
     * 验证IP地址格式是否正确（简单验证）
     * 
     * @param ip IP地址（可能为null）
     * @return true-格式正确，false-格式错误
     */
    public static boolean isValidIpFormat(String ip) {
        if (ip == null || ip.trim().isEmpty()) {
            return false;
        }
        
        String trimmedIp = ip.trim();
        
        // IPv4格式验证（简单版本）
        String ipv4Pattern = "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
        if (trimmedIp.matches(ipv4Pattern)) {
            return true;
        }
        
        // IPv6格式简单检查
        if (trimmedIp.contains(":")) {
            return true; // 简单检查，包含冒号认为是IPv6
        }
        
        return false;
    }
}

